Open/Closed Principle (OCP) হল অবজেক্ট-ওরিয়েন্টেড ডিজাইনের একটি গুরুত্বপূর্ণ নীতি, যা SOLID নীতিগুলির একটি অংশ। এই নীতিটি প্রথমে বার্ট্রান্ড মেয়ারের দ্বারা প্রকাশিত হয় এবং এর মূল ধারণা হল:
Open/Closed Principle-এর সংজ্ঞা
একটি সফটওয়্যার মডিউল (ক্লাস, ফাংশন, ইত্যাদি) এমনভাবে ডিজাইন করা উচিত যে এটি এক্সটেনশনের জন্য খোলা এবং পরিবর্তনের জন্য বন্ধ।
অর্থাৎ, একটি মডিউলের আচরণ পরিবর্তন করতে হলে, তার মূল কোড পরিবর্তন না করে নতুন কোড যোগ করতে হবে। এই নীতিটি সফটওয়্যার ডিজাইনকে আরও মজবুত এবং রক্ষণাবেক্ষণযোগ্য করে।
প্রধান ধারণাসমূহ
এক্সটেনশনের জন্য খোলা:
- এটি নির্দেশ করে যে আপনি একটি বিদ্যমান সিস্টেমে নতুন কার্যকারিতা যোগ করতে পারেন, কিন্তু পুরনো কোডে পরিবর্তন করার প্রয়োজন নেই। এটি সাধারণত ইনহেরিটেন্স, ইন্টারফেস, অথবা অ্যাবস্ট্র্যাক্ট ক্লাসের মাধ্যমে অর্জিত হয়।
পরিবর্তনের জন্য বন্ধ:
- একটি ক্লাস বা মডিউল যখন তৈরি হয়, তখন এটি পরিবর্তনের জন্য অস্থির হতে হবে। এর অর্থ হলো, নতুন বৈশিষ্ট্য যোগ করতে হলে নতুন ক্লাস বা মডিউল তৈরি করতে হবে, পুরনো কোড পরিবর্তন করার দরকার নেই। এটি বিদ্যমান কোডের ওপর নতুন ফিচার যুক্ত করার সময় ত্রুটি কমাতে সহায়ক।
OCP-এর সুবিধা
- ত্রুটির ঝুঁকি কমানো: যেহেতু আপনি পুরনো কোড পরিবর্তন করছেন না, তাই নতুন ত্রুটি তৈরির সম্ভাবনা কমে যায়।
- রক্ষণাবেক্ষণ সহজ: নতুন ফিচার যোগ করতে হলে পুরনো কোডে হস্তক্ষেপের প্রয়োজন নেই, যা রক্ষণাবেক্ষণকে সহজ করে।
- লচিলাতা বৃদ্ধি: পরিবর্তনশীল চাহিদার সাথে মানিয়ে নিতে সক্ষম হয়।
OCP বাস্তবায়নের কৌশল
ইনহেরিটেন্স:
- একটি ক্লাসের বৈশিষ্ট্য এবং আচরণ অন্য ক্লাস দ্বারা অর্জিত হয়। নতুন ক্লাস তৈরি করে পুরনো ক্লাসের কার্যকারিতা বৃদ্ধি করা যায়।
ইন্টারফেস এবং অ্যাবস্ট্র্যাক্ট ক্লাস:
- ইন্টারফেস বা অ্যাবস্ট্র্যাক্ট ক্লাস ব্যবহার করে নতুন ক্লাস তৈরি করা যায় যা আগের ক্লাসগুলোর সাথে মানানসই হয়।
কম্পোজিশন:
- ইনহেরিটেন্সের পরিবর্তে কম্পোজিশন ব্যবহার করা। এটি শ্রেণীর মধ্যে একত্রিত করে নতুন কার্যকারিতা যোগ করতে সাহায্য করে।
OCP-এর উদাহরণ
একটি সহজ উদাহরণ ধরি যেখানে একটি ডিস্কাউন্ট ক্যালকুলেটর ক্লাস রয়েছে:
class DiscountCalculator:
def calculate_discount(self, order, customer_type):
if customer_type == 'regular':
return order.total * 0.1
elif customer_type == 'premium':
return order.total * 0.2
এই ক্ষেত্রে, নতুন গ্রাহক প্রকার যুক্ত করার জন্য আমাদের DiscountCalculator ক্লাস পরিবর্তন করতে হবে, যা OCP-এর বিরুদ্ধে যায়।
OCP অনুসরণ করা
OCP অনুসরণ করতে, আমরা নিচের মতো ডিজাইন প্যাটার্ন ব্যবহার করতে পারি:
class DiscountStrategy(ABC):
@abstractmethod
def calculate_discount(self, order):
pass
class RegularDiscount(DiscountStrategy):
def calculate_discount(self, order):
return order.total * 0.1
class PremiumDiscount(DiscountStrategy):
def calculate_discount(self, order):
return order.total * 0.2
class DiscountCalculator:
def __init__(self, strategy: DiscountStrategy):
self.strategy = strategy
def calculate_discount(self, order):
return self.strategy.calculate_discount(order)
# ব্যবহারে
order = Order(100)
calculator = DiscountCalculator(RegularDiscount())
print(calculator.calculate_discount(order)) # 10
উপসংহার
Open/Closed Principle (OCP) একটি মৌলিক নীতি যা সফটওয়্যার ডিজাইনকে আরও স্থায়ী এবং রক্ষণাবেক্ষণযোগ্য করে। OCP অনুসরণ করে, ডেভেলপাররা এমন সিস্টেম তৈরি করতে পারেন যা নতুন বৈশিষ্ট্য যুক্ত করতে সক্ষম হয়, যখন পুরনো কোডের ওপর কোনও পরিবর্তন করা হয় না। এটি একটি কার্যকরী এবং স্থায়ী সফটওয়্যার ডিজাইন নিশ্চিত করে।
Read more